package sword_offer;

/**
 * @author Synhard
 * @version 1.0
 * @Class sword_offer.Code21
 * @Description 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
 * 例如，字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值，
 * 但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。
 * @tel 13001321080
 * @email 823436512@qq.com
 * @date 2021-03-15 19:27
 */
public class Code21 {
    public static void main(String[] args) {
        System.out.println(isNumber("-1E-16"));
    }
    public static boolean isNumber(String s) {
        boolean num = false;
        boolean exponent = false;
        boolean dot = false;
        s = s.trim();
        for (int i = 0; i < s.length(); i++) {
            char head = s.charAt(i);
            if (head >= 48 && head <= 57) {
                num = true;
            } else if (head == '.') {
                if (dot || exponent) {
                    return false;
                }
                dot = true;
            }
            else if (head == '+' || head == '-') {
                if (i != 0 && !(s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) {
                    return false;
                }
            }
            else if (head == 'e' || head == 'E') {
                if (exponent || !num) {
                    return false;
                }
                exponent = true;
                num = false;
            } else {
                return false;
            }
        }
        return num;
    }

}
/*
数字的格式是：
A.BEC
A代表整数部分，B代表小数部分，C代表指数部分
1. 数字部分必须出现，不存在 e  .
2. 小数点最多出现1次，而且不能出现在e的后面
3. 正负号只能出现在首位或者是e后面的首位
4. 指数前后必须都有数字，并且最多出现一次
 */
